package com.jeehentor.utils;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description : 分页工具类
 * @Author : wzd
 * @Date : 2024/5/10 15:08
 * @Version : 1.0
 **/
public class PageUtil {

    /**
     * 实体转vo
     * @param originalPage
     * @param <T>
     * @return
     */
    public static <T> Page<T> conversionVoPage(Page<?> originalPage,Class<T> clazz) {
        if (originalPage == null) {
            return null;
        }
        Page<T> newPage = new Page<>();
        // 设置分页总记录数
        newPage.setTotal(originalPage.getTotal());
        // 设置分页显示记录数
        newPage.setSize(originalPage.getSize());
        // 设置分页当前页码
        newPage.setCurrent(originalPage.getCurrent());
        // 设置分页总页数（这一行通常不是必需的，因为它会根据size和total自动计算）
        newPage.setPages(originalPage.getPages());
        // 复制记录列表，这里假设T类型具有有效的复制构造函数或克隆方法
        List<T> copiedRecords = originalPage.getRecords().stream()
                .map(record -> copyOrClone(record, clazz))
                .collect(Collectors.toList());
        newPage.setRecords(copiedRecords);
        return newPage;
    }

    private static <T> T copyOrClone(Object record, Class<T> clazz) {
        try {
            T newRecord = clazz.getDeclaredConstructor().newInstance();
            BeanUtils.copyProperties(record, newRecord);
            return newRecord;
        } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
            throw new RuntimeException("创建对象失败", e);
        }
    }
}
